package com.seovic.loader.target; import com.seovic.core.Defaults; import com.seovic.core.Updater; import com.seovic.loader.Target; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; /** * A {@link Target} implementation that loads objects into database using JPA. * * @author Ivan Cikic 2009.11.26 */ public class JpaTarget extends AbstractObjectTarget { // ---- constructors ---------------------------------------------------- /** * Construct JpaTarget instance. * * @param persistenceUnitName the name of persistence unit * @param entityClass the entity class */ public JpaTarget(String persistenceUnitName, Class entityClass) { super(entityClass); m_persistenceUnitName = persistenceUnitName; } // ---- Target implementation ------------------------------------------- /** * {@inheritDoc} */ @Override public void beginImport() { if (m_emf == null) { m_emf = Persistence.createEntityManagerFactory(m_persistenceUnitName); } m_em = m_emf.createEntityManager(); m_batch = new ArrayList(m_batchSize); } /** * @param item item to import */ @SuppressWarnings({"unchecked"}) public void importItem(Object item) { m_batch.add(item); if (m_batch.size() % m_batchSize == 0) { mergeInTransaction(m_em, m_batch); m_batch.clear(); } } /** * {@inheritDoc} */ @Override public void endImport() { if (!m_batch.isEmpty()) { mergeInTransaction(m_em, m_batch); } if (m_em != null && m_em.isOpen()) { m_em.close(); } if (m_emf != null) { m_emf.close(); } } /** * {@inheritDoc} */ @Override protected Updater createDefaultUpdater(String propertyName) { return Defaults.createUpdater(propertyName); } // ---- helper methods -------------------------------------------------- /** * Persist collection of objects. * * @param em entity manager used to persist objects * @param objects objects to persist */ private void mergeInTransaction(EntityManager em, Collection objects) { EntityTransaction tx = null; try { tx = em.getTransaction(); tx.begin(); for (Object o : objects) { em.merge(o); } tx.commit(); } catch (RuntimeException e) { if (tx != null && tx.isActive()) { tx.rollback(); } throw e; } } // ---- data members ---------------------------------------------------- /** * Default batch size. */ private static final int DEFAULT_BATCH_SIZE = 1000; /** * The batch size. */ private int m_batchSize = DEFAULT_BATCH_SIZE; /** * Batch of items. */ private transient List m_batch; /** * Entity manager factory. */ private EntityManagerFactory m_emf; /** * Entity manger. */ private EntityManager m_em; /** * The name of persistence unit. */ private String m_persistenceUnitName; }